// buffer 代表的是内存，内存是引用类型
// 拷贝内存拷贝的都是引用 如何实现一个"深拷贝"
const arr = [[0], 1, 2, 3];
const newArr = arr.slice(0, 1);
newArr[0][0] = 100;
console.log(arr);

//  buffer的声明方式：三种 （提供大小）

console.log(Buffer.alloc(5)); // 声明一个内存大小，我们一般会 将内容拷贝到上面 （扩容）
console.log(Buffer.from([258])); // 这种方式基本不会使用， 不好用
console.log(Buffer.from("你好")); // e4 bd a0 e5 a5 bd 可以直接用字符串来声明buffer

// copy  < concat(最终我们会采用concat来用)

const b1 = Buffer.from("你好");
const b2 = Buffer.from("世界");
// const b3 = Buffer.alloc(b1.length + b2.length); // 字节长度，不是字符串长度

Buffer.prototype.copy = function (
  target,
  targetStart,
  sourceStart = 0,
  sourceEnd = this.length
) {
  for (let i = 0; i < sourceEnd - sourceStart; i++) {
    target[targetStart + i] = this[sourceStart + i];
  }
};
// b1.copy(b3, 0); // 不写拷贝的长度就是都拷贝
// b2.copy(b3, 6);
// console.log(b3.toString());

Buffer.concat = function (
  list,
  total = list.reduce((memo, current) => (memo += current.length), 0)
) {
  const bigBuf = Buffer.alloc(total);
  let position = 0;
  list.forEach((buf) => {
    buf.copy(bigBuf, position);
    position += buf.length; // 内部就是将内存 1个个的拷贝到新的buffer上去
  });
  return bigBuf;
};

const buf = Buffer.concat([b1, b2]);
const sl = buf.slice(0, 1);
sl[0] = 100;
console.log(buf);

// buffer.length  字节长度
// buffer.copy 拷贝  -》 用不到
// Buffer.concat()拼接buffer 用的比较多
// Buffer.isBuffer 判断是不是buffer类型
// buf.slice() 截取某个内存空间，但是内部存放的是原来的引用地址

// buffer的基本使用
